package com.rasenhund.android.grecorder.pref;

import java.util.ArrayList;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.widget.Toast;

import com.rasenhund.android.grecorder.R;
import com.rasenhund.android.grecorder.common.Const;
import com.rasenhund.android.grecorder.dao.RecordDao;
import com.rasenhund.android.grecorder.helper.DbHelper;
import com.rasenhund.android.grecorder.schema.Record;
import com.rasenhund.android.grecorder.schema.StageRecord;
import com.rasenhund.android.myutility.FileUtil;
import com.rasenhund.android.myutility.StringUtil;

/**
 * 設定画面 > バックアップ
 */
public class BackupDialogPreference extends DialogPreference {
    @SuppressWarnings("unused")
    private static final String TAG = BackupDialogPreference.class.getSimpleName();
    private final BackupDialogPreference self = this;

    private Context mContext;

    /**
     * Constructor
     * 
     * @param context
     * @param attrs
     */
    public BackupDialogPreference(Context context, AttributeSet attrs) {
        super(context, attrs);

        mContext = context;

        setDialogTitle("");
        setDialogMessage(mContext.getResources().getString(R.string.msg_backup_confirm));

    }

    /**
     * ダイアログクローズ時の処理
     */
    @Override
    protected void onDialogClosed(boolean positiveResult) {

        if (positiveResult) {
            // TODO: バックアップが存在する場合は上書き確認

            if (backup()) {
                Toast.makeText(mContext,
                        mContext.getResources().getString(R.string.msg_backup_complete),
                        Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(mContext,
                        mContext.getResources().getString(R.string.msg_backup_failed),
                        Toast.LENGTH_SHORT).show();
            }
        }

        super.onDialogClosed(positiveResult);
    }

    /**
     * バックアップ
     * 
     * @param fileVersion
     * @return
     */
    private boolean backup() {

        Boolean bIsErr = false; // エラーフラグ
        String sTmp = ""; // 出力データ

        String sFolder = Const.getCurrentFolder(mContext); // 出力フォルダ
        String sPath = Const.getCsvFilePath(mContext); // 出力ファイルのフルパス

        // 全データの取得
        ArrayList<StageRecord> list = null;
        
        // 表示用データの取得
        DbHelper dbHelper = null;
        SQLiteDatabase db = null;

        try {

            dbHelper = new DbHelper(mContext);
            db = dbHelper.getWritableDatabase();
            RecordDao dao = new RecordDao(db);

            list = dao.selectAll();

        } finally {
            if (db.isOpen()) {
                db.close();
            }
        }

        if (list.size() == 0) {
            // 出力データが存在しない
            bIsErr = true;
        }

        if (!bIsErr) {
            String status = Environment.getExternalStorageState();
            if (!status.equals(Environment.MEDIA_MOUNTED)) {
                // 外部ストレージが存在しない
                bIsErr = true;
            }
        }

        if (!bIsErr) {
            // 出力用の文字列作成

            // 1行目はファイルバージョン
            sTmp = String.valueOf(Const.getDatabaseVersion()) + "\n";

            Record record;

            // 2行目以降が実データ
            // ステージコード, カテゴリコード, 結果コード, 作成日時, 対戦人数, ポイント, ランク, メモ, 除外フラグ
            for (int i = 0; i < list.size(); i++) {

                record = list.get(i);

                sTmp += String.valueOf(record.getStageCd()) + ",";
                sTmp += String.valueOf(record.getCategoryCd()) + ",";
                sTmp += String.valueOf(record.getResultCd()) + ",";
                sTmp += record.getInsertDate() + ",";
                sTmp += String.valueOf(record.getVersus()) + ",";
                sTmp += String.valueOf(record.getPoint()) + ",";
                sTmp += String.valueOf(record.getRankCd()) + ",";
                // メモは改行を許容しているためBase64エンコードして出力する
                sTmp += StringUtil.encodeToBase64(record.getMemo()) + ",";
                sTmp += String.valueOf(record.getExcludeFlg()) + ",";

                sTmp += "\n";
            }

            if (!bIsErr) {

                if (!FileUtil.makeDir(sFolder)) {
                    // フォルダの作成に失敗
                    bIsErr = true;
                }
            }

            if (!bIsErr) {
                if (!FileUtil.writeFile(sPath, sTmp)) {
                    // 書込みに失敗
                    bIsErr = true;
                }
            }

        }

        if (bIsErr) {
            return false;
        }

        return true;

    }

}
